--- Response Parser module
--- @author chengyu liu mliuchengyu@live.cn

Response = {}

-- 登录信息
Response.logininfo = {}

local cjson     = require "cjson"
local resty_rsa = require "rsa"

function Response:apply( ... )
    -- body
end

-- 获取数据签名
-- @return string
function Response:getSign( params, public_key )
        local pub, err = resty_rsa:new({ public_key = public_key })
        if not pub then
            self:error("new rsa err: "..err)
            return
        end
        local encrypted, err = pub:encrypt( self:getSignContent(params) )
        if not encrypted then
            self:error("failed to encrypt: "..err)
            return
        end
        return ngx.encode_base64(encrypted)
end

-- 校验数据签名
-- @return string
function Response:getSignVerify( params, encrypted, private_key )
        local priv, err = resty_rsa:new({ private_key = private_key })
        if not priv then
            self:error("new rsa err: "..err)
            return
        end
        local decrypted = priv:decrypt(ngx.decode_base64(encrypted))
        return decrypted == self:getSignContent(params)
end


-- 数据签名处理
-- @param array $data 需要进行签名数据
-- @return bool|string
function Response:getSignContent( params )
        local keys, tmp = {}, {}
        --提出所有的键名并按字符顺序排序
        for k, _ in pairs(params) do
            if k ~= "sign" then
                keys[#keys+1] = k
            end
        end
        table.sort(keys)
         --根据排序好的键名依次读取值并拼接字符串成key=value&key=value
        for _,k in pairs(keys) do
            if type(params[k]) == "string" or type(params[k]) == "number" then
                tmp[#tmp+1] = k .. "=" .. tostring(params[k])
            end
        end
        --将salt添加到最后，计算正确的签名sign值并与传入的sign签名对比，
        return table.concat(tmp, "&")
end

-- 返回成功的操作
-- @param mixed msg 消息内容
-- @param array data 返回数据
-- @param integer code 返回代码
function Response:success(msg,data)
        local result = {}
        result["code"],result["message"],result["data"] = 200,msg,data
        ngx.say(cjson.encode(result))
        return ngx.exit(200)
end

-- 返回失败的操作
-- @param mixed msg 消息内容
-- @param array data 返回数据
-- @param integer code 返回代码
function Response:error(msg,data)
        local result = {}
        result["code"],result["message"],result["data"] = 0,msg,data
        ngx.say(cjson.encode(result))
        return ngx.exit(200)
end


return Response